package com.esunny.resourcevisualization.controller;

import com.esunny.resourcevisualization.domain.entity.EnumGroup;
import com.esunny.resourcevisualization.domain.entity.EnumItem;
import com.esunny.resourcevisualization.domain.request.EnumDto;
import com.esunny.resourcevisualization.domain.response.ReturnStructure;
import com.esunny.resourcevisualization.service.EnumService;
import com.esunny.resourcevisualization.util.ConstantUtil;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @version 1.0.0.0
 * @ClassName EnumController
 * @Description 资源字段控制层接口
 * @Author baochencong
 * @Date 2020/9/30 8:21
 */
@Controller
@RequestMapping("/enum")
public class EnumController {

    @Resource
    private EnumService enumService;

    private static Logger LOGGER = LoggerFactory.getLogger(EnumController.class);

    /**
     * 添加枚举数据
     *
     * @param enumDto 枚举数据
     * @return 添加结果信息
     */
    @ResponseBody
    @PostMapping("/addEnumData")
    public ReturnStructure addEnumData(@RequestBody EnumDto enumDto) {
        if (enumGroupIsNull(enumDto)) {
            return new ReturnStructure(ConstantUtil.HTTP_NOT_FOUND_CODE, "该枚举组数据为空", null);
        }
        if (enumItemListIsNull(enumDto)) {
            return new ReturnStructure(ConstantUtil.HTTP_NOT_FOUND_CODE, "该枚举组至少要有一个枚举项", null);
        }
        return enumService.addEnumData(enumDto);
    }

    /**
     * 添加枚举项
     *
     * @param enumDto 枚举项
     * @return 添加结果信息
     */
    @ResponseBody
    @PostMapping("/addEnumItem")
    public ReturnStructure addEnumItem(@RequestBody EnumDto enumDto) {
        if (enumGroupIsNull(enumDto)) {
            return ReturnStructure.NOT_FOUND("枚举组英文名为空", null);
        }
        if (enumItemListIsNull(enumDto)) {
            return ReturnStructure.NOT_FOUND("至少要添加一个枚举项", null);
        }
        List<EnumItem> failedAddEnumItemList = enumService.addEnumItem(enumDto);
        LOGGER.info("添加失败的枚举项有：{}", failedAddEnumItemList);
        return failedAddEnumItemListIsNull(failedAddEnumItemList) ?
                ReturnStructure.SUCCESS("添加枚举项成功", null)
                :
                ReturnStructure.ERROR("添加枚举项失败", failedAddEnumItemList);
    }

    /**
     * 通过枚举组英文名删除枚举组
     *
     * @param groupName 枚举组英文名
     * @return 删除枚举组结果
     */
    @ResponseBody
    @PostMapping("/deleteEnumGroupByGroupName")
    public ReturnStructure deleteEnumGroupByGroupName(@RequestParam("groupName") String groupName) {
        if (StringUtils.isBlank(groupName)) {
            return ReturnStructure.NOT_FOUND();
        }
        return enumService.deleteEnumGroupByGroupName(groupName);
    }

    /**
     * 通过枚举项id删除枚举项
     *
     * @param itemId 枚举项id
     * @return 删除枚举项结果信息
     */
    @ResponseBody
    @PostMapping("/deleteEnumItemByItemId")
    public ReturnStructure deleteEnumItemByItemId(@RequestParam("itemId") int itemId) {
        if (StringUtils.isBlank(itemId + "")) {
            return ReturnStructure.NOT_FOUND();
        }
        return enumService.deleteEnumItemByItemId(itemId);
    }

    /**
     * 通过枚举组英文名修改枚举组信息
     *
     * @param enumGroup 枚举组信息
     * @return 修改枚举组结果信息
     */
    @ResponseBody
    @PostMapping("/updateEnumGroup")
    public ReturnStructure updateEnumGroup(@RequestBody EnumGroup enumGroup) {
        if (enumGroup == null) {
            return ReturnStructure.NOT_FOUND();
        }
        return enumService.updateEnumGroup(enumGroup);
    }

    /**
     * 通过枚举组英文名获取枚举组信息
     *
     * @param groupName 枚举组英文名
     * @return 获取枚举组结果信息
     */
    @ResponseBody
    @GetMapping("/getEnumGroupByGroupName/{groupName}")
    public ReturnStructure getEnumGroupByGroupName(@PathVariable("groupName") String groupName) {
        if (StringUtils.isBlank(groupName)) {
            return ReturnStructure.NOT_FOUND();
        }
        EnumGroup enumGroupByGroupName = enumService.getEnumGroupByGroupName(groupName);
        if (enumGroupByGroupName == null) {
            return ReturnStructure.NOT_FOUND("未获取到该枚举组信息", null);
        }
        return ReturnStructure.SUCCESS("获取枚举组信息成功", enumGroupByGroupName);
    }

    /**
     * 获取枚举组列表信息
     *
     * @return 获取枚举组列表结果信息
     */
    @ResponseBody
    @GetMapping("/getEnumGroupList")
    public ReturnStructure getEnumGroupList() {
        List<EnumGroup> enumGroupList = enumService.getEnumGroupList();
        if (enumGroupList == null || enumGroupList.isEmpty()) {
            return ReturnStructure.NOT_FOUND();
        }
        return ReturnStructure.SUCCESS("获取枚举组列表成功", enumGroupList);
    }

    /**
     * 通过枚举组英文名获取枚举项列表
     *
     * @param groupName 枚举组英文名
     * @return 获取枚举项列表结果信息
     */
    @ResponseBody
    @GetMapping("/getEnumItemByGroupName/{groupName}")
    public ReturnStructure getEnumItemByGroupName(@PathVariable("groupName") String groupName) {
        if (StringUtils.isBlank(groupName)) {
            return ReturnStructure.NOT_FOUND();
        }
        List<EnumItem> enumItemByGroupName = enumService.getEnumItemByGroupName(groupName);
        return ReturnStructure.SUCCESS("获取枚举项列表成功", enumItemByGroupName);
    }

    /**
     * 通过枚举组id获取枚举项列表
     *
     * @param groupId 枚举组id
     * @return 获取枚举项列表结果信息
     */
    @ResponseBody
    @GetMapping("/getEnumItemByGroupId/{groupId}")
    public ReturnStructure getEnumItemByGroupId(@PathVariable("groupId") int groupId) {
        if (StringUtils.isBlank(groupId + "")) {
            return ReturnStructure.NOT_FOUND();
        }
        return ReturnStructure.SUCCESS("获取枚举项列表成功", enumService.getEnumItemListByGroupId(groupId));
    }

    /**
     * 判断添加失败的枚举项列表是否为空
     *
     * @param enumItemList 添加失败的枚举项列表
     * @return 是否为空
     */
    private boolean failedAddEnumItemListIsNull(List<EnumItem> enumItemList) {
        return enumItemList == null || enumItemList.isEmpty();
    }

    /**
     * 判断枚举组是否为空
     *
     * @param enumDto 枚举数据
     * @return 枚举组是否为空
     */
    private boolean enumGroupIsNull(@NotNull EnumDto enumDto) {
        return enumDto.getEnumGroup() == null;
    }

    /**
     * 判断枚举项列表不为空
     *
     * @param enumDto 枚举数据
     * @return 枚举项列表是否为空
     */
    private boolean enumItemListIsNull(@NotNull EnumDto enumDto) {
        List<EnumItem> enumItemList = enumDto.getEnumItemList();
        return enumItemList == null || enumItemList.isEmpty();
    }
}
